package com.dzwww.recommend.rule.common.api;

import com.dzwww.recommend.rule.util.StringPlaceholderFormatter;
import org.apache.commons.lang3.StringUtils;

/**
 * 消息对象，子类可以通过 enum 类型来实现状态码与消息内容的定义
 *
 * @author winner
 */
public interface ApiMessage {

    /**
     * 状态码
     *
     * @return 返回消息状态码
     */
    String getCode();

    /**
     * 消息内容
     *
     * @return 返回消息内容
     */
    String getMessage();

    /**
     * 带参格式化
     *
     * @param args 格式化参数列表
     * @return 格式化字符串
     */
    default String formatMessage(Object... args) {
        String msg = getMessage();
        if (StringUtils.isBlank(msg) || args == null || args.length < 1) {
            return msg;
        }
        return StringPlaceholderFormatter.format(msg, args);
    }

    /**
     * 转换为ApiResult
     *
     * @return ApiException
     */
    default ApiResult toResult() {
        return ApiResult.fail(getCode(), getMessage());
    }

    /**
     * 转换为ApiResult
     *
     * @param args 带参Message的参数
     * @return ApiException
     */
    default ApiResult toResult(Object... args) {
        return ApiResult.fail(getCode(), formatMessage(args));
    }

    /**
     * 转换为异常
     *
     * @return ApiException
     */
    default ApiException toException() {
        return new ApiException(this);
    }

    /**
     * 转换为异常
     *
     * @param args 带参Message的参数
     * @return ApiException
     */
    default ApiException toException(Object... args) {
        return new ApiException(this, args);
    }

    /**
     * 抛出异常
     *
     * @throws ApiException ApiException
     */
    default void throwException() throws ApiException {
        throw new ApiException(this);
    }

    /**
     * 抛出异常
     *
     * @param args args
     * @throws ApiException ApiException
     */
    default void throwException(Object... args) throws ApiException {
        throw new ApiException(this, args);
    }

}
